function  Foo() {
    getName = function () {
        console.log(1)
    }
    return this
}

Foo.getName = function (){
    console.log(2)
}

Foo.prototype.getName = function (){
    console.log(3)
}

var getName = function (){
    console.log(4)
}

function getName(){
    console.log(5)
}

Foo.getName() // 2
getName() // 4
Foo().getName() // 1
getName() // 1
new Foo().getName() // 3

// 解析：
// 首先，Foo.getName()会打印出2，这是因为Foo.getName是一个直接在Foo函数上定义的静态方法。

// 接着，getName()会打印出4，这是因为在顶级作用域中定义了一个具有相同名称的匿名函数，并且它会在函数声明之前被赋值。

// 接下来是Foo().getName()，首先需要注意的是Foo()实际上返回了this，即全局对象window，所以整个表达式可以看作是window.getName()。
// 但是，在Foo函数内部，getName被重新赋值为一个函数，它打印出1。因此，最终打印的结果是1。

// 然后是getName()，这里没有使用Foo函数调用，因此在全局作用域中调用的是先前定义的匿名函数，它打印出4。

// 最后是new Foo().getName()，首先执行new Foo()会创建一个新的对象，并将this绑定到这个新对象上。
// 然后通过原型链继承，该对象可以访问到Foo.prototype上定义的getName方法。因此，最终打印的结果是3。